package com.tsx.demo;

import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.VerticalAlignment;
import com.tsx.utils.PdfFontUtil;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

public class PdfEllipseGenerator {

    private final PdfDocument pdfDocument;
    private final Document document;
    private final PdfFont pdfFont;

    /**
     * 构造函数，初始化PDF文档
     *
     * @param dest PDF文件的目标路径
     */
    public PdfEllipseGenerator(String dest) {
        try {
            PdfWriter writer = new PdfWriter(dest);
            pdfDocument = new PdfDocument(writer);
            pdfDocument.addNewPage();
            document = new Document(pdfDocument);
            pdfFont = PdfFontUtil.chinesePdfFont(); // 假设 PdfFontUtil.chinesePdfFont() 是获取中文字体的方法
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 添加旋转的椭圆、多条水平分隔线和自定义文本到PDF文档
     *
     * @param rectangle        椭圆所在的矩形区域
     * @param rotationAngle    旋转角度（度）
     * @param lineYCoordinates 水平分隔线的y坐标列表
     * @param topText          上部显示的文本
     * @param middleText       中部显示的文本
     * @param bottomText       下部显示的文本
     */
    public void addRotatedEllipseWithLinesAndText(Rectangle rectangle, float rotationAngle, List<Float> lineYCoordinates, String topText, String middleText, String bottomText) {
        PdfCanvas pdfCanvas = new PdfCanvas(pdfDocument.getFirstPage());
        pdfCanvas.saveState(); // 保存当前画布状态

        // 计算旋转中心点（椭圆中心）
        float centerX = rectangle.getLeft() + rectangle.getWidth() / 2;
        float centerY = rectangle.getBottom() + rectangle.getHeight() / 2;

        // 创建旋转矩阵
        double angle = Math.toRadians(rotationAngle); // 将角度转换为弧度
        double cos = Math.cos(angle);
        double sin = Math.sin(angle);

        // 应用旋转变换
        pdfCanvas.concatMatrix(cos, sin, -sin, cos,
                centerX - centerX * cos + centerY * sin,
                centerY - centerX * sin - centerY * cos);

        // 绘制椭圆
        pdfCanvas.setStrokeColor(ColorConstants.RED)
                .setLineWidth(2)
                .ellipse(rectangle.getLeft(), rectangle.getBottom(),
                        rectangle.getRight(), rectangle.getTop())
                .stroke();

        // 绘制水平分隔线
        pdfCanvas.setStrokeColor(ColorConstants.RED)
                .setLineWidth(2);
        for (float y : lineYCoordinates) {
            pdfCanvas.moveTo(rectangle.getLeft() + 6, y)
                    .lineTo(rectangle.getRight() - 6, y)
                    .stroke();
        }

        Canvas canvas = new Canvas(pdfCanvas, rectangle);

        // 添加文本到三个部分
        addCenteredText(topText, pdfFont, 16, rectangle, canvas, rectangle.getTop() - rectangle.getHeight() / 6);
        addCenteredText(middleText, pdfFont, 22, rectangle, canvas, rectangle.getBottom() + rectangle.getHeight() / 2);
        addCenteredText(bottomText, pdfFont, 16, rectangle, canvas, rectangle.getBottom() + rectangle.getHeight() / 6);

        // 恢复画布状态（取消旋转）
        pdfCanvas.restoreState();
    }

    /**
     * 在给定矩形区域内居中添加文本
     *
     * @param text      要添加的文本
     * @param font      文本字体
     * @param fontSize  文本字号
     * @param rectangle 矩形区域
     * @param canvas    画布对象
     * @param y         文本的y坐标
     */
    private void addCenteredText(String text, PdfFont font, float fontSize, Rectangle rectangle, Canvas canvas, float y) {
        Paragraph paragraph = new Paragraph(text)
                .setFontColor(ColorConstants.RED)
                .setFont(font)
                .setFontSize(fontSize);
        canvas.showTextAligned(paragraph,
                rectangle.getLeft() + rectangle.getWidth() / 2, y,
                TextAlignment.CENTER, VerticalAlignment.MIDDLE);
    }

    /**
     * 关闭PDF文档
     */
    public void closeDocument() {
        document.close();
    }

    public static void main(String[] args) throws IOException {
        // 设置PDF文件的目标路径
        String dest = Paths.get(Constants.dest, "test.pdf").toString();
        PdfEllipseGenerator generator = new PdfEllipseGenerator(dest);

        // 定义椭圆所在的矩形区域
        Rectangle rectangle = new Rectangle(100, 400, 200, 100);

        // 指定旋转角度
        float rotationAngle = 20; // 示例旋转角度30度

        // 提供水平分隔线的y坐标列表
        List<Float> lineYCoordinates = List.of(
                rectangle.getBottom() + rectangle.getHeight() * 2 / 3,
                rectangle.getBottom() + rectangle.getHeight() / 3
        );

        // 自定义每个部分的文本
        String topText = "名字";
        String middleText = "状态";
        String bottomText = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));

        // 添加旋转的椭圆、多条水平分隔线和自定义文本
        generator.addRotatedEllipseWithLinesAndText(
                rectangle,
                rotationAngle,
                lineYCoordinates,
                topText,
                middleText,
                bottomText
        );

        // 关闭PDF文档
        generator.closeDocument();
        System.out.println("PDF创建成功: " + dest);
        OutputStream os = Files.newOutputStream(Paths.get(dest));
    }
}
